package ar.com.fiuba.team2.model;


import java.util.ArrayList;
import java.util.Date;

import org.jdom2.Element;

import ar.com.fiuba.team2.parser.GeneralParser;

public class Chat {

	private Long lastCallTimestamp;
	private Result message;
	private Data data;
	
	
	// Se agrega contructor del chat
	
	public Chat (Long scopeId) {
		this();
		
		this.setMeessage(new Result());
		this.getData().setIdChat(scopeId); 
		// TODO el id de chat es igual al id del ambito?
		this.getData().setIdAmbito(scopeId); 
		
	}
	
	
	public Chat() {
		data = new Data();
		message = new Result();
		lastCallTimestamp =  new Date().getTime();
	}


	/**
	 * @return the lastCallTimestamp
	 */
	public Long getLastCallTimestamp() {
		return lastCallTimestamp;
	}
	/**
	 * @param lastCallTimestamp the lastCallTimestamp to set
	 */
	public void setLastCallTimestamp(Long lastCallTimestamp) {
		this.lastCallTimestamp = lastCallTimestamp;
	}
	/**
	 * @return the meessage
	 */
	public Result getMeessage() {
		return message;
	}
	/**
	 * @param meessage the meessage to set
	 */
	public void setMeessage(Result meessage) {
		this.message = meessage;
	}
	/**
	 * @return the data
	 */
	public Data getData() {
		return data;
	}
	/**
	 * @param data the data to set
	 */
	public void setData(Data data) {
		this.data = data;
	}
	
	public ArrayList<MensajeChat> getNewMensajes(long lastCallTimestamp){
		
		ArrayList<MensajeChat> newMensajes= this.data.getLastMensajes(lastCallTimestamp);
		
		return newMensajes;
	}

	/* (non-Javadoc)
	 * @see java.lang.Object#hashCode()
	 */
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((data == null) ? 0 : data.hashCode());
		result = prime
				* result
				+ ((lastCallTimestamp == null) ? 0 : lastCallTimestamp
						.hashCode());
		return result;
	}


	/* (non-Javadoc)
	 * @see java.lang.Object#equals(java.lang.Object)
	 */
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Chat other = (Chat) obj;
		if (data == null) {
			if (other.data != null)
				return false;
		} else if (!data.equals(other.data))
			return false;
		return true;
	}
	
	@Override
	public String toString() {
		return "Chat: [id = "
			+ getData().getIdChat() 
			+ ", timestamp: " 
			+ lastCallTimestamp + "]";
	}
	
	public String toXML() {
		StringBuilder str = new StringBuilder();
		str.append("<Chat>");
			if(this.getData().getIdChat() != null) {
				str.append("<id>");
				str.append(this.getData().getIdChat());
				str.append("</id>");
			}
			str.append("<idAmbito>");
			str.append(getData().getIdAmbito());
			str.append("</idAmbito>");
		if(!getData().getMiembros().isEmpty()) {
			str.append("<miembrosChat>");
			for(MiembroChat m : getData().getMiembros()) {
				str.append(m.toXML());
			}
			str.append("</miembrosChat>");
		}
		str.append("</Chat>");
		
		return str.toString();
	}
	
	public void fromXML(Element element) {
		
		Long idChat = GeneralParser.extractLong(element, "id");
		this.getData().setIdChat(idChat);
		
		Long idAmbito = GeneralParser.extractLong(element, "idAmbito");
		this.getData().setIdAmbito(idAmbito);
		
		Element miembros = element.getChild("miembrosChat");
		if (miembros != null) {
			for (Element miembroXML : miembros.getChildren("MiembroChat")) {
				MiembroChat miembro = new MiembroChat();
				miembro.fromXML(miembroXML);
				this.getData().addMiembro(miembro);
			}
		}
	}
}
